package com.qwe.graduation.controller.core;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qwe.graduation.entity.User;
import com.qwe.graduation.service.IUserService;
import com.qwe.graduation.shiro.utils.JwtUtil;
import com.qwe.graduation.utils.RedisUtil;
import com.qwe.graduation.utils.Result;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.util.UUID;

/**
 * @author lzf
 * @date 2022/10/20 15:48
 * @description userController
 */
@RestController
@RequestMapping("/test")
@CrossOrigin //跨域？
@Slf4j
public class UserCoreController {
    @Autowired
    private IUserService IUserService;
    @Autowired
    private RedisUtil redisUtil;

    @PostMapping("/user")
    public void addUser(@RequestBody User user) {
        IUserService.save(user);
    }

    @GetMapping("/user")
    public Result<IPage<User>> addUser(HttpServletRequest request) {
        Page<User> page = new Page<User>(1, 5);
//        return page.setRecords(userService.page(page));userService.list();
//        userService.list(page);
//        QueryWrapper wrapper = new QueryWrapper();
        //mp的分页方法也可以用条件构造器
        Page<User> page1 = IUserService.page(page);
        String userIdByToken = JwtUtil.getUserIdByToken(request);
        System.out.println(userIdByToken);

        return Result.OK("成功",page1);
    }

    @GetMapping("/user1")
    public Result<IPage<User>> addUser1() {
        Page<User> page = new Page<User>(1, 5);
//        return page.setRecords(userService.page(page));userService.list();
//        userService.list(page);
//        QueryWrapper wrapper = new QueryWrapper();
        //mp的分页方法也可以用条件构造器
        Page<User> page1 = IUserService.page(page);
        return Result.OK("成功",page1);
    }


    /**
     * 登录用户
     */
    @ApiOperation(value = "登录用户", notes = "登录用户")
    @PostMapping("/login")
    public Result save(@RequestBody User user){
//        ValidatorUtils.validateEntity(user, ValidGroups.AddGroup.class);
        User user1 = new User();
        BeanUtils.copyProperties(user, user1);
        IUserService.save(user1);
        String s = String.valueOf(user1.getId());
        String sign = JwtUtil.sign(s, user.getUserPhone());
        return Result.ok(sign);
    }


    //模拟视频图片上传
    @ApiOperation("模拟视频图片上传")
    @PostMapping("/updateAvatar")
    public Result<String> upload(@RequestPart MultipartFile file){
        //获取文件名称
        String filename = file.getOriginalFilename();
        //在这里可以判断，只要自己需要的文件类型，判断后缀名
        log.info(filename);
        //重新随机生成名字
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        filename = uuid + filename;



        String os = System.getProperty("os.name");
        String staticResource;
        log.info("操作系统" + os);
        //如果是Windows系统
        if (os.toLowerCase().startsWith("win")) {
            staticResource = "D:\\test\\img\\";
        }else{//linux 和mac
            staticResource = "/opt/file/image/";
        }

        //这里应该把filename保存到数据库,供前端访问时使用
        // 上传文件/图像到指定文件夹（这里可以改成你想存放地址的相对路径）
        File savePos = new File(staticResource);
        // 不存在，则创建该文件夹
        if(!savePos.exists()){
            savePos.mkdir();
        }
        // 获取存放位置的规范路径
        String realPath;
        try {
            realPath = savePos.getCanonicalPath();
            file.transferTo(new File(realPath+"/"+ filename));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        // 上传该文件/图像视频至该文件夹下
        //上传成功，返回保存的文件地址
        return Result.OK("/graduation/ecmweb/pic/" + filename);
    }

//    /**
//     * 登录注册接口，返回用户信息
//     * @param
//     * @return
//     */
//    @ApiOperation("登录注册接口")
//    @PostMapping("/Login")
//    public Result<JSONObject> login(@RequestBody User user) throws IOException {
//        Result<JSONObject> result = new Result<JSONObject>();
//
//        //2. 校验用户是否存在,不存在则注册用户,存在则更新
//        QueryWrapper<SysUser> queryWrapper = new QueryWrapper<>();
//        queryWrapper.eq("phone", phone);
//        SysUser user = userService.getOne(queryWrapper);
//
//        if (user == null){
//            //不存在，注册用户
//            userService.registeredUser(appLoginDto);
//            user = userService.getOne(queryWrapper);
//        }else {
//            //根据手机号更新用户信息
//            userService.updateUser(appLoginDto);
//            user = userService.getOne(queryWrapper);
//        }
//
//        //更获取用户登录信息
//        userService.userInfo(user, result);
//
//        return result;
//    }
    /**
     * redis试用
     */
    @GetMapping("/queryRedis")
    public Object queryRedis(){
        //自定义一个固定的key方便取redis中缓存的值
        String redisKey="key1";
        redisUtil.get(redisKey);
        /*通过redisTemplate.opsForValue()方法得到一个ValueOperations对象
          对Redis进行缓存操作
        */
//        ValueOperations<String, Object> vo = redisTemplate.opsForValue();
        //通过key去拿value，这一步是为了看redis中当前这个键-值队中是否有值
//        Object o = vo.get(redisKey);
//        //判断redis中没有缓存数据
//        if (null==o) {
//            //用来测试redis是否缓存数据，如果缓存了就不会打印这句话
//            System.out.println("第一次进入，当前redis中没有数据");
//            //没有缓存数据的话，写入数据（数据库操作同样如此）
//            vo.set(redisKey, "编程本就是逆天而行，死在路上很正常");
//            //数据库操作省略这一步
//            if (null!=vo.get(redisKey)){
//                o=vo.get(redisKey);
//            }
//        }
        System.out.println(redisUtil.get(redisKey));

        return redisUtil.get(redisKey);
    }


}
